<?php
    if (!defined('__IS_LEAF__')) exit('Access Denied!');

    /**
     * 监控类，通过调用其他类库，监测应用的运行状态
     */

    class Monitor {


        /**
         * 记录和统计时间（微秒）和内存使用情况
         * 使用方法:
         * <code>
         * G('begin'); // 记录开始标记位
         * // ... 区间运行代码
         * G('end'); // 记录结束标签位
         * echo G('begin','end',6); // 统计区间运行时间 精确到小数后6位
         * echo G('begin','end','m'); // 统计区间内存使用情况
         * 如果end标记位没有定义，则会自动以当前作为标记位
         * 其中统计内存使用需要 MEMORY_LIMIT_ON 常量为true才有效
         * </code>
         * @param string $start 开始标签
         * @param string $end 结束标签
         * @param integer|string $dec 小数位或者m
         * @return mixed
         */
        static public function G($start,$end='',$dec=4) {
            if( !defined('MEMORY_LIMIT_ON') ){
                define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
            }
            static $_info       =   array();
            static $_mem        =   array();
            if(is_float($end)) { // 记录时间
                $_info[$start]  =   $end;
            }elseif(!empty($end)){ // 统计时间和内存使用
                if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);
                if(MEMORY_LIMIT_ON && $dec=='m'){
                    if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();
                    return unitConvert($_mem[$end]-$_mem[$start]);
                }else{
                    return number_format(($_info[$end]-$_info[$start]),$dec);
                }

            }else{ // 记录时间和内存使用
                $_info[$start]  =  microtime(TRUE);
                if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
            }
        }

        /**
         * 只用于统计数据库信息，和上面函数一样，区分开是因为上面的是全局的，不能和其冲突
         */
        static public function GS($start,$end='',$dec=4) {
            if( !defined('MEMORY_LIMIT_ON') ){
                define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
            }
            static $_info       =   array();
            static $_mem        =   array();
            if(is_float($end)) { // 记录时间
                $_info[$start]  =   $end;
            }elseif(!empty($end)){ // 统计时间和内存使用
                if(!isset($_info[$end])) $_info[$end]       =  microtime(TRUE);
                if(MEMORY_LIMIT_ON && $dec=='m'){
                    if(!isset($_mem[$end])) $_mem[$end]     =  memory_get_usage();
                    return unitConvert($_mem[$end]-$_mem[$start]);
                }else{
                    return number_format(($_info[$end]-$_info[$start]),$dec);
                }

            }else{ // 记录时间和内存使用
                $_info[$start]  =  microtime(TRUE);
                if(MEMORY_LIMIT_ON) $_mem[$start]           =  memory_get_usage();
            }
        }        

    }
?>